home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 426-450 / disk_441 / dme / src / menu.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  6KB  |  303 lines

  1.  
  2. /*
  3.  *  MENU.C
  4.  *
  5.  *  Menu routines... made to take up as little space as possible, and
  6.  *  thus uses many tricks which you should watch out for.
  7.  */
  8.  
  9. #include "defs.h"
  10.  
  11. Prototype void menu_strip (struct Window *);
  12. Prototype void menu_off (void);
  13. Prototype void menu_on (void);
  14. Prototype void do_menuoff (void);
  15. Prototype void do_menuon (void);
  16. Prototype char *menutomacro (char *);
  17. Prototype char *menu_cmd (struct IntuiMessage *);
  18. Prototype void fixmenu (void);
  19. Prototype void do_menuclear (void);
  20. Prototype void do_menuadd (void);
  21. Prototype void do_menudelhdr (void);
  22. Prototype int do_menudel (void);
  23.  
  24. typedef struct {
  25.     ITEM item;
  26.     char *com;
  27. } XITEM;
  28.  
  29. short Menuoff;
  30. short DoMenuoff;
  31.  
  32. MENU *Menu;
  33.  
  34. void
  35. menu_strip(win)
  36. WIN *win;
  37. {
  38.     if (!Menuoff && Menu) {
  39.     SetMenuStrip(win,Menu);
  40.     Forbid();
  41.     win->Flags &= ~RMBTRAP;
  42.     Permit();
  43.     }
  44. }
  45.  
  46. void
  47. menu_off()
  48. {
  49.     ED *ed;
  50.     if (Menuoff == 0) {
  51.     for (ed = (ED *)DBase.mlh_Head; ed->Node.mln_Succ; ed = (ED *)ed->Node.mln_Succ) {
  52.         ClearMenuStrip(ed->Win);
  53.         Forbid();
  54.         ed->Win->Flags |= RMBTRAP;
  55.         Permit();
  56.     }
  57.     }
  58.     ++Menuoff;
  59. }
  60.  
  61. void
  62. menu_on()
  63. {
  64.     ED *ed;
  65.     if (Menu && Menuoff == 1) {
  66.     fixmenu();
  67.     for (ed = (ED *)DBase.mlh_Head; ed->Node.mln_Succ; ed = (ED *)ed->Node.mln_Succ) {
  68.         SetMenuStrip(ed->Win,Menu);
  69.         Forbid();
  70.         ed->Win->Flags &= ~RMBTRAP;
  71.         Permit();
  72.     }
  73.     }
  74.     --Menuoff;
  75. }
  76.  
  77. void
  78. do_menuoff()
  79. {
  80.     menu_off();
  81.     ++DoMenuoff;
  82. }
  83.  
  84. void
  85. do_menuon()
  86. {
  87.     if (DoMenuoff) {
  88.     --DoMenuoff;
  89.     menu_on();
  90.     }
  91. }
  92.  
  93. char *
  94. menutomacro(str)
  95. char *str;
  96. {
  97.     char header[64];
  98.     char itembuf[64];
  99.     short i;
  100.     char *ptr;
  101.     MENU *menu;
  102.     ITEM *item;
  103.  
  104.     for (i = 0; str[i] && str[i] != '-'; ++i);
  105.     if (str[i] == '-') {
  106.     strncpy(header, str, i);
  107.     header[i] = 0;
  108.     strcpy(itembuf, str + i + 1);
  109.     for (menu = Menu; menu; menu = menu->NextMenu) {
  110.         if (ncstrcmp(header, menu->MenuName) == 0) {
  111.         for (item = menu->FirstItem; item; item = item->NextItem) {
  112.             ptr = (char *)((ITEXT *)item->ItemFill)->IText;
  113.             if (ncstrcmp(itembuf, ptr) == 0) {
  114.             ptr = ((XITEM *)item)->com;
  115.             goto done;
  116.             }
  117.         }
  118.         }
  119.     }
  120.     }
  121.     ptr = NULL;
  122. done:
  123.     return(ptr);
  124. }
  125.  
  126. char *
  127. menu_cmd(im)
  128. IMESS *im;
  129. {
  130.     XITEM *item;
  131.  
  132.     if (item = (XITEM *)ItemAddress(Menu, im->Code))
  133.     return(item->com);
  134.     return(NULL);
  135. }
  136.  
  137. void
  138. fixmenu()
  139. {
  140.     MENU *menu;
  141.     ITEM *item;
  142.     ITEXT *it;
  143.     int row, col, maxc, scr;
  144.  
  145.     col = 0;
  146.     for (menu = Menu; menu; menu = menu->NextMenu) {
  147.     short hdr_width;
  148.     maxc = strlen(menu->MenuName);
  149.     hdr_width = maxc * 8 + 16;
  150.     menu->Width = hdr_width;
  151.     row = 0;
  152.     for (item = menu->FirstItem; item; item = item->NextItem) {
  153.         it = (ITEXT *)item->ItemFill;
  154.         item->TopEdge = row;
  155.         scr = strlen(((ITEXT *)item->ItemFill)->IText);
  156.         if (scr > maxc)
  157.         maxc = scr;
  158.         item->Height = 10;
  159.         row += item->Height;
  160.     }
  161.     maxc = (maxc * 8) + 16;
  162.     for (item = menu->FirstItem; item; item = item->NextItem)
  163.         item->Width = maxc;
  164.     menu->LeftEdge = col;
  165.     menu->Height = row;
  166.     col += hdr_width;
  167.     }
  168. }
  169.  
  170. /*
  171.  *  menuclear
  172.  *  menuadd    header    item    command
  173.  *  menudel    header    item
  174.  *  menudelhdr    header
  175.  */
  176.  
  177. void
  178. do_menuclear()
  179. {
  180.     menu_off();
  181.     while (Menu) {
  182.     av[1] = (ubyte *)Menu->MenuName;
  183.     do_menudelhdr();
  184.     }
  185.     menu_on();
  186. }
  187.  
  188. void
  189. do_menuadd()
  190. {
  191.     MENU *menu, **mpr;
  192.     ITEM *item, **ipr;
  193.     ITEXT *it;
  194.  
  195.     menu_off();
  196.     mpr = &Menu;
  197.     for (menu = *mpr; menu; menu = *mpr) {
  198.     if (strcmp(av[1], menu->MenuName) == 0) {
  199.         ipr = &menu->FirstItem;
  200.         for (item = *ipr; item; item = *ipr) {
  201.         if (strcmp(av[2], ((ITEXT *)item->ItemFill)->IText) == 0)
  202.             goto newname;
  203.         ipr = &item->NextItem;
  204.         }
  205.         goto newitem;
  206.     }
  207.     mpr = &menu->NextMenu;
  208.     }
  209. newmenu:    /*    create new menu */
  210.     menu = malloc(sizeof(MENU));
  211.     clrmem(menu, sizeof(MENU));
  212.     menu->NextMenu = *mpr;
  213.     *mpr = menu;
  214.     menu->Flags = MENUENABLED;
  215.     menu->MenuName = malloc(strlen(av[1])+1);
  216.     strcpy(menu->MenuName, av[1]);
  217.     ipr = &menu->FirstItem;
  218.     *ipr = NULL;
  219. newitem:    /*    create new item */
  220.     it = malloc(sizeof(ITEXT));
  221.     clrmem(it, sizeof(ITEXT));
  222.     it->BackPen = 1;
  223.     it->DrawMode = JAM2;
  224.     it->IText = malloc(strlen(av[2])+1);
  225.     strcpy(it->IText, av[2]);
  226.     item = malloc(sizeof(XITEM));
  227.     clrmem(item, sizeof(XITEM));
  228.     item->NextItem = *ipr;
  229.     *ipr = item;
  230.     item->ItemFill = (APTR)it;
  231.     item->Flags = ITEMTEXT|ITEMENABLED|HIGHCOMP;
  232. newname:    /*    create new name */
  233.     if (((XITEM *)item)->com)
  234.     free(((XITEM *)item)->com);
  235.     ((XITEM *)item)->com = malloc(strlen(av[3])+1);
  236.     strcpy(((XITEM *)item)->com, av[3]);
  237.     menu_on();
  238. }
  239.  
  240. void
  241. do_menudelhdr()
  242. {
  243.     MENU *menu;
  244.     MENU **mpr;
  245.  
  246.     menu_off();
  247.     mpr = &Menu;
  248.     for (menu = *mpr; menu; menu = *mpr) {
  249.     if (strcmp(av[1], menu->MenuName) == 0) {
  250.         if (menu->FirstItem) {
  251.         while (menu->FirstItem) {
  252.             av[2] = ((ITEXT *)menu->FirstItem->ItemFill)->IText;
  253.             if (do_menudel())
  254.             break;
  255.         }
  256.         break;
  257.         }
  258.         *mpr = menu->NextMenu;
  259.         free(menu->MenuName);
  260.         free(menu);
  261.         break;
  262.     }
  263.     mpr = &menu->NextMenu;
  264.     }
  265.     menu_on();
  266. }
  267.  
  268. int
  269. do_menudel()
  270. {
  271.     MENU *menu;
  272.     ITEM *item, **ipr;
  273.     ITEXT *it;
  274.     short ret = 0;
  275.  
  276.     menu_off();
  277.     for (menu = Menu; menu; menu = menu->NextMenu) {
  278.     if (strcmp(av[1], menu->MenuName) == 0) {
  279.         ipr = &menu->FirstItem;
  280.         for (item = *ipr; item; item = *ipr) {
  281.         it = (ITEXT *)item->ItemFill;
  282.         if (strcmp(av[2], it->IText) == 0) {
  283.             *ipr = item->NextItem;
  284.             free(it->IText);
  285.             free(it);
  286.             free(((XITEM *)item)->com);
  287.             free(item);
  288.             if (!menu->FirstItem) {
  289.             do_menudelhdr();
  290.             ret = 1;
  291.             }
  292.             menu_on();
  293.             return((int)ret);
  294.         }
  295.         ipr = &item->NextItem;
  296.         }
  297.     }
  298.     }
  299.     menu_on();
  300.     return((int)ret);
  301. }
  302.  
  303.